﻿using System.ComponentModel;
using System.Reflection;

namespace VM.Common.Enums
{
    public static class EnumHelper
    {
        // 获取指定枚举类型的所有描述信息
        public static List<string> GetEnumDescriptions<T>() where T : Enum
        {
            return Enum.GetValues(typeof(T)).Cast<T>()
                .Select(e => GetEnumDescription(e as Enum))
                .ToList();
        }

        // 获取单个枚举值的 Description 属性
        public static string GetEnumDescription(Enum value)
        {
            var attribute = GetDescriptionAttribute(value);
            return attribute?.Description ?? value.ToString();
        }

        // 根据 Description 值获取对应的枚举值
        public static T GetEnumValueFromDescription<T>(string description) where T : Enum
        {
            foreach (var value in Enum.GetValues(typeof(T)).Cast<T>())
            {
                if (GetEnumDescription(value as Enum) == description)
                    return value;
            }

            // 如果没有找到匹配的描述，抛出异常
            throw new ArgumentException($"没有找到匹配的描述 '{description}' 对应的枚举值。", nameof(description));
        }

        // 获取指定枚举值的 DescriptionAttribute 属性
        private static DescriptionAttribute GetDescriptionAttribute(Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            return field?.GetCustomAttribute<DescriptionAttribute>();
        }
    }
}
